<?php

namespace Syrius\Adapter;

/**
 * Classe che gestisce le transazioni ad alto livello
 * @package Adapter
 * @author <domenico.biancardi@gmail.com>
 */ class Transaction {
	/**
	 * @property bool
	 * indica se ci si trova all'interno di una transazione o meno
	 */
	private $_activeTransaction = false;

	/**
	 * @property Syrius_Adapter_Mysql
	 * Rappresenta il driver per l'esecuzione delle query SQL
	 */
	private $_driver;

	/**
	 * @param name srting
	 * Recupera il driver di connessione
	 */
	public function __construct($name = "default") {
		$this->_driver = Connection::getConnection($name);
	}

	/**
	 * Se esiste una transaction attiva, deve essere spenta
	 */
	public function __destruct() {
	}

	/**
	 * @param mode bool
	 * permette di settare l'autocommit sul database, attenzione quando si chiama una Syrius_Adapter_Transaction::start() l'autocommit viene disattivato e viene riportato allo stato iniziale in un secondo momento
	 */
	public function setAutocommit($mode = false) {
		$autocommitQuery = new \Syrius\Query\SetVariable_Autocommit ($mode);
		$this->_driver->query($autocommitQuery);
	}

	/**
	 * @exception Syrius_Exception_Not_In_Transaction
	 * effettua la commit di una transazione
	 */
	public function commit() {
		if (!$this->_transaction_in_progress)
			throw new Syrius_Exception_Not_In_Transaction ();
		$this->_driver->commit();
		$this->_activeTransaction = false;
		$this->setAutocommit(true);
	}

	/**
	 * Permette di sapere se il database attuale �settato in modalit�autocommit o meno
	 * To determine the current state of autocommit use the SQL command SELECT @@autocommit.
	 */
	public function isAutocommit() {
		$autocommitQuery = new \Syrius\Query\Show_Autocommit ();
		$sql = new Query ($autocommitQuery);
		$result = new Result ($sql);
		$res = $result->fetchObject();
		if ($res->{"@@autocommit"} == 1)
			return true;
		return false;
	}

	/**
	 * @exception Syrius_Exception_Not_In_Transaction
	 * Permette di ripristinare uno stato iniziale
	 */
	public function rollback() {
		if (!$this->_transaction_in_progress)
			throw new Syrius_Exception_Not_In_Transaction ();
		$this->_driver->rollback();
		$this->_activeTransaction = false;
		$this->setAutocommit(true);
	}

	/**
	 * Effettua l'inizio di una transazione. Per effettuare questa operazione bisogna dire al database di disabilitare l'autocommit
	 */
	public function start() {
		$this->setAutocommit(false);
		$this->_activeTransaction = true;
	}

}

?>
